/*
 * Exception.cpp
 *
 *  Created on: Apr 11, 2013
 *      Author: Lucifer
 */

#include "../pch.h"
#include "StringTraits.h"
#include <string.h>

#ifdef	_WIN32
#pragma warning (disable: 4996)
#endif

namespace BFX
{

//////////////////////////////////////////////////////////////////////////////
// Exception

// NOTE: these classes need to handle lowest errors, so we can't use String class here.

Exception::Exception()
	: m_pszMessage(NULL), m_pszFileName(NULL), m_nLine(-1), m_pszFunctionName(NULL)
{

}
Exception::Exception(const char* pszMsg)
	: m_pszMessage(NULL), m_pszFileName(NULL), m_nLine(-1), m_pszFunctionName(NULL)
{
	m_pszMessage = ::strdup(pszMsg);
}

Exception::Exception(const char* pszFile, int nLine, const char* pszFunc)
	: m_pszMessage(NULL), m_pszFileName(NULL), m_nLine(-1), m_pszFunctionName(NULL)
{
	if (pszFile)
		m_pszFileName = ::strdup(pszFile);
	if (pszFunc)
		m_pszFunctionName = ::strdup(pszFunc);
}
Exception::Exception(const char* pszMsg, const char* pszFile, int nLine, const char* pszFunc)
	: m_pszMessage(NULL), m_pszFileName(NULL), m_nLine(-1), m_pszFunctionName(NULL)
{
	if (pszMsg)
		m_pszMessage = ::strdup(pszMsg);
	if (pszFile)
		m_pszFileName = ::strdup(pszFile);
	if (pszFunc)
		m_pszFunctionName = ::strdup(pszFunc);
}

Exception::Exception(const Exception& e)
	: m_nLine(e.m_nLine)
{
	if (e.m_pszMessage)
		m_pszMessage = ::strdup(e.m_pszMessage);
	if (e.m_pszFileName)
		m_pszFileName = ::strdup(e.m_pszFileName);
	if (e.m_pszFunctionName)
		m_pszFunctionName = ::strdup(e.m_pszFunctionName);
}

Exception::~Exception() throw()
{
	if (m_pszMessage)
		::free(m_pszMessage);
	if (m_pszFileName)
		::free(m_pszFileName);
	if (m_pszFunctionName)
		::free(m_pszFunctionName);
}

const char* Exception::GetMessage() const
{
	return m_pszMessage;
}

}	//	namespace BFX
